\documentclass[a4paper,10pt]{article} 
%Defino el tipo de hoja, el tama\~no de la letra b\'asico y el tipo de proyecto(en general no importa mucho esto \'ultimo)


\usepackage[left=2cm,right=2cm,top=3cm,bottom=1cm,includefoot,head=1.5cm]{geometry} %m\'argenes

%tipo de letra con que escribir y habilito las letras de c\'alculos
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage[spanish]{babel}
\usepackage{fontenc}

%para cargar im\'agenes
\usepackage{graphicx}
\usepackage[unicode]{hyperref}

\usepackage{lastpage}

%boludeces para que quede m\'as lindo
\usepackage{fancyhdr} 
\pagestyle{fancy}


%un comando que uso en mi portada expecifica
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}}

%Esto mucho no importa, porque no agrego la portada default de LateX
\title{Informe TP1}
\author{Grupo_Alpha}

%Empiezo el documento en si
\begin{document}

%aca inserto mi portada personal
\input{./title.tex}

\newpage

%esto crea el \'indice del tp
\tableofcontents

\newpage

%Bueno los ducumentos se dividen en section, subsection, subsubsection y creo que hay m\'as, pero es muy poco probable usarlos

\section{Introducci\'on y Objetivos}

El objetivo del trabajo es familiarizarse con el camino de datos de la
arquitectura MIPS y la implementaci\'on del pipeline de cinco etapas, analizando
los diferentes ciclos de stall y entender como utilizar ese tiempo para mejorar
el desempe\~no de un programa.

\section{Explicaci\'on Del Programa}
El trabajo se realizo en dos programas por separados. Cada uno fue probado de
manera independiente con el programa 'WinDLX' para obtener las estadisticas
deseadas, asi como la posibilidad de ver el estado del pipeline en cada ciclo
para poder analizarlo y realizar mejoras sobre los programas.
 

\section{Programa 1}

\textbf{Nota:}  El primer programa pide que el resultado de la variable Z sea de
tipo double, para esto es necesario pasar las variables en registros de tipo
entero a registros de punto flotante y realizar la conversi\'on a double. Sin
embargo no se logro obtener un resultado coherente utilizando este medio ya que
el simulador no parece tener bien implementada esta funcionalidad. De todas
formas el codigo se dejo con la conversion a punto flotante ya que el objetivo
no es obtener un resultado sino ver como optimizar el codigo aprovechando los
ciclos de stall, cosa que el codigo cumple de todas formas.

\subsection{Sin Reordenamiento}

\begin{verbatim}
;A=4
;B=5
;C=7
;D=3
;X=B+C
;Y=D-C
;Z=(((((A+C)-B)*C)-X)/Y)
;A=X*Y*3
;
;A,B,C, D en memoria, X = t8,Y = t9,Z = f0 en registros, Z es double

.global main
main:
	addu	r29,r0,60	;levanto el sp por que parece que arranca en 0 en el windlx
	subu 	r29,r29,24	;8 del segmento obligatorio, 16 del segmento de variables locales
	sw		20(r29),r30
	sw		16(r29),r28
	;move	r30,r29
	addi	r8,r0,4
	sw		0(r29),r8	;A=4
	addi	r8,r0,5
	sw		4(r29),r8	;B=5
	addi	r8,r0,7
	sw		8(r29),r8	;C=7
	addi	r8,r0,3
	sw		12(r29),r8	;D=3

	lw		r8,4(r29)	;B
	lw		r9,8(r29)	;C
	add		r24,r8,r9	;X=B+C

	lw		r8,12(r29)	;D
	lw		r9,8(r29)	;C
	sub		r25,r8,r9	;Y=D-C

	lw		r8,0(r29)	;A
	lw		r9,8(r29)	;C
	add		r10,r8,r9	;A+C
	lw		r8,4(r29)	;B
	sub		r10,r10,r8	;(A+C)-B
	lw		r8,8(r29)	;C
	mult	r10,r10,r8	;((A+C)-B)*C

	sub		r10,r10,r24	;(((A+C)-B)*C)-X
	

	movi2fp	f2,r10		;paso a fp el valor temporal
	cvti2d	f6,f2		;paso a fp el reg Y

	movi2fp	f4,r25		;paso a fp el reg Y
	cvti2d	f8,f4

	divd	f0,f6,f8	;Z=(((((A+C)-B)*C)-X)/Y)

	mult	r8,r24,r25	;X*Y

	addi	r9,r0,3

	mult	r8,r8,r9	;X*Y*3

	sw		0(r29),r8	;A=X*Y*3

	addi	r2,r0,1		;exit ok

	lw		r28,16(r29)
	lw		r30,20(r29)
	addu 	r29,r29,24
	trap	0			;j		r31
\end{verbatim}

\subsubsection{Sin FORWARDING}
\noindent CPI= 92/40 = 2.3 \\
\noindent Cantidad de STALLS: 51 (55.43\% of all Cycles) \\
\indent	RAW stalls: 47 (51.10\% of all Cycles) \\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 0  \\
\indent	Trap stalls: 4 (4.35\% of all Cycles) \\

\subsubsection{Con FORWARDING}
\noindent CPI= 63/40 = 1,575 \\
\noindent Cantidad de STALLS: 22 (34.92\% of all Cycles) \\
\indent	RAW stalls: 16 (25.40\% of all Cycles) \\
\indent \indent	LD stalls: 5 (31.25\% of RAW stalls)\\
\indent \indent	Branch/Jump stalls: 0  \\
\indent \indent	FP stalls: 11 (68.75\% of RAW stalls)\\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 0  \\
\indent	Trap stalls: 6 (9.52\% of all Cycles) \\

\subsection{Con Reordenamiento}

\begin{verbatim}
;A=4
;B=5
;C=7
;D=3
;X=B+C
;Y=D-C
;Z=(((((A+C)-B)*C)-X)/Y)
;A=X*Y*3
;
;A,B,C, D en memoria, X = t8,Y = t9,Z = f0 en registros, Z es double

.global main
main:
	addu	r29,r0,60	;levanto el sp por que parece que arranca en 0 en el windlx
	subu 	r29,r29,24	;8 del segmento obligatorio, 16 del segmento de variables locales
	sw		20(r29),r30
	sw		16(r29),r28
	;move	r30,r29
	addi	r8,r0,4
	sw		0(r29),r8	;A=4
	addi	r8,r0,5
	sw		4(r29),r8	;B=5
	addi	r8,r0,7
	sw		8(r29),r8	;C=7
	addi	r8,r0,3
	sw		12(r29),r8	;D=3

	lw		r8,4(r29)	;B
	lw		r9,8(r29)	;C
	add		r24,r8,r9	;X=B+C

	lw		r8,12(r29)	;D
	lw		r9,8(r29)	;C
	sub		r25,r8,r9	;Y=D-C

	lw		r8,0(r29)	;A
	lw		r9,8(r29)	;C
	add		r10,r8,r9	;A+C
	lw		r8,4(r29)	;B
	sub		r10,r10,r8	;(A+C)-B
	lw		r8,8(r29)	;C
	mult	r10,r10,r8	;((A+C)-B)*C

	movi2fp	f4,r25		;paso a fp el reg Y
	cvti2d	f8,f4


	sub		r10,r10,r24	;(((A+C)-B)*C)-X
	

	movi2fp	f2,r10		;paso a fp el valor temporal
	cvti2d	f6,f2		;paso a fp el reg Y

; ANTES	movi2fp	f4,r25		;paso a fp el reg Y
;	cvti2d	f8,f4

	divd	f0,f6,f8	;Z=(((((A+C)-B)*C)-X)/Y)

	mult	r8,r24,r25	;X*Y

	addi	r9,r0,3

	mult	r8,r8,r9	;X*Y*3

	addi	r2,r0,1		;exit ok

	sw		0(r29),r8	;A=X*Y*3

; ANTES	addi	r2,r0,1		;exit ok

	lw		r28,16(r29)
	lw		r30,20(r29)
	addu 	r29,r29,24
	trap	0			;j		r31
\end{verbatim}

\subsubsection{Sin FORWARDING}
\noindent CPI= 87/40 = 2.175 \\
\noindent Cantidad de STALLS: 46 (52.87\% of all Cycles) \\
\indent	RAW stalls: 42 (48.28\% of all Cycles) \\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 0  \\
\indent	Trap stalls: 4 (4.60\% of all Cycles) \\

\subsubsection{Con FORWARDING}
\noindent CPI= 61/40 = 1,525 \\
\noindent Cantidad de STALLS: 20 (32.80\% of all Cycles) \\
\indent	RAW stalls: 13 (21.31\% of all Cycles) \\
\indent \indent	LD stalls: 5 (38.46\% of RAW stalls)\\
\indent \indent	Branch/Jump stalls: 0  \\
\indent \indent	FP stalls: 8 (61.54\% of RAW stalls)\\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 0  \\
\indent	Trap stalls: 7 (11.48\% of all Cycles) \\

\section{Programa 2}

\subsection{Sin Reordenamiento}

\begin{verbatim}

		.data
		.global	DIEZ
DIEZ: 		.word	10
		.global ONCE
ONCE: 		.word	11
		.text
		.global main
main:
		addi r2,r0,0		; a = 0
		addi r1,r0,0		; i = 0
		lw r9,ONCE
		lw r10,DIEZ
inicio_for: 
		andi r4,r1,0x0001	;if (i % 2)
		beqz r4,segundo_if	
		add r2,r2,r1		; a += i
		
segundo_if:	sgt r3,r2,r9	;if (a>ONCE) -> break;
		bnez r3,fin			;interrumpo el for
		slt r5,r1,r10		; (i<10) ? (Si no lo es r5==0)
		beqz r5,fin			;"break"
		addi r1,r1,1		; ++i
		j inicio_for
fin:		trap 0

\end{verbatim}

\subsubsection{Sin FORWARDING}
\noindent CPI= 138/69 = 2 \\
\noindent Cantidad de STALLS: 68 (49.28\% of all Cycles) \\
\indent	RAW stalls: 54 (39.13\% of all Cycles) \\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 12 (8.70\% of all Cycles) \\
\indent	Trap stalls: 2 (1.45\% of all Cycles) \\


\subsubsection{Con FORWARDING}

\noindent CPI= 130/92=1,4130 \\
\noindent Cantidad de STALLS: 37 (28.46\% of all Cycles) \\
\indent	RAW stalls: 23 (17.69\% of all Cycles) \\
\indent \indent	LD stalls: 0 \\
\indent \indent	Branch/Jump stalls: 23 (100.00\% of RAW stalls) \\
\indent \indent	FP stalls: 0 \\
\indent WAW stalls: 0 \\
\indent Structural stalls: 0 \\
\indent Control stalls: 12 (9.23\% of all Cycles) \\
\indent Trap stalls: 2 (1.54\% of all Cycles) \\
\newline

\subsection{Con Reordenamiento}

\begin{verbatim}
		.data
		.global	DIEZ
DIEZ: 		.word	10
		.global ONCE
ONCE: 		.word	11
		.text
		.global main
main:
		addi r2,r0,0		; a = 0
		addi r1,r0,0		; i = 0

inicio_for: 
		andi r4,r1,0x0001	;if (i % 2)
		lw r9,ONCE			;Estaban antes de "inicio_for"
		lw r10,DIEZ			;Estaban antes de "inicio_for"
		beqz r4,segundo_if	
		add r2,r2,r1		; a += i
		
segundo_if:	sgt r3,r2,r9	;if (a>ONCE) -> break;
		slt r5,r1,r10		; (i<10) ? (Si no lo es r5==0) Estaba despues del branch
		bnez r3,fin			;interrumpo el for

		addi r1,r1,1		; ++i
		beqz r5,fin			;"break"

		j inicio_for
fin:	trap 0
\end{verbatim}

\subsubsection{Sin FORWARDING}

\noindent CPI = 117/84 = 1,3929 \\
\noindent Cantidad de STALLS: 32 (27.35\% of all Cycles) \\
\indent	RAW stalls: 18 (15.38\% of all Cycles) \\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 12 (10.26\% of all Cycles) \\
\indent	Trap stalls: 2 (1.71\% of all Cycles) \\


\subsubsection{Con FORWARDING}

\noindent CPI = 99/84=1.1786 \\
\noindent Cantidad de STALLS: 14 (14.14\% of all Cycles) \\
\indent	RAW stalls: 0 \\
\indent \indent	LD stalls: 0 \\
\indent \indent	Branch/Jump stalls: 0 \\
\indent \indent	FP stalls: 0 \\
\indent	WAW stalls: 0 \\
\indent	Structural stalls: 0 \\
\indent	Control stalls: 12 (12.12\% of all Cycles) \\
\indent	Trap stalls: 2 (2.02\% of all Cycles) \\\\


\subsection{Utilizando instrucciones nop para disminuir el CPI}

\paragraph{Dado el siguiente c\'odigo (con la opci\'on de forwarding desactivada):\newline}
\begin{math}
\\ andi\ r4,r1,0x0001 \\
nop \\
nop \\
beqz\ r4,segundo\_if
\end{math}
\paragraph{Las dos instrucciones nop agregadas entre la instrucciones $andi\ r4,r1,1$ y $bneqz\ r4,segundo\_if$ hace que disminuya el CPI, pues la dependencia de datos entre ambas instrucciones crea un RAW-Hazard del registro $r4$. Las instrucciones $nop$ disminuyen el CPI pues para cuando el branch va ser ejecutado, la intrucci\'on $andi$ ya escribi\'o en el {\em register file} en la etapa {\em wb}. Evitando as\'i dos stalls.}
\paragraph{La siguiente tabla refleja un ejemplo de los valores obtenidos para el CPI promedio mediante la aplicaci\'on del segmento de c\'odigo insertando instrucciones $nop$:\\\\}
\begin{tabular}[r]{|c|c|} \hline
Cantidad nop's & CPI \\ \hline
0 & 1.671 \\ \hline
1 & 1.5 \\ \hline
2 & 1.360 \\ \hline
3 & 1.33 \\ \hline
4 & 1.304 \\ \hline
\end{tabular}

\end{document}
